define(function(require, exports, module){
	/**
	 * @namespace utils
	 * @memberof Nuui
	 * @desc Nuui的工具类集合，可以直接调用 
	 */
	var utils = exports;

	/**
	 * @memberof Nuui.utils
	 * @desc 获得单选按钮的选中值
	 * @func getRadioValue
	 * @static
	 * @param {string} name - input[type=radio]的name
	 * @param {view} view -  当前的view
	 * @returns {string}  value  单选按钮的选中值
	 * @example //return input[name = 'way'] 单选按钮中选中项的值
	 * Nuui.utils.getRadioValue('way',view);
	 */
	utils.getRadioValue = function(name, view){
		var scope = view || window;
		var radios = scope.$("input[type=radio][name=" + name + "]");
		var value = null;
		radios.each(function(i, radio){
			radio = $(radio);
			if(radio.parent().hasClass("checked")){
				value = radio.val();
				return false;
			}
		});
		return value;
	}
	
	/**
	 * @memberof Nuui.utils
	 * @desc 获得多选框的选中值
	 * @func getCheckboxValues
	 * @static
	 * @param {string} name - input[type=checkbox]的name
	 * @param {view} view - 当前的view
	 * @returns {array} values 多选框选中的值,数组形式
	 */
	utils.getCheckboxValues = function(name, view){
		var scope = view || window;
		var checkboxs = scope.$("input[type=checkbox][name=" + name + "]");
		var values = [];
		checkboxs.each(function(i, checkbox){
			checkbox = $(checkbox);
			if(checkbox.parent().hasClass("checked")){
				values.push(checkbox.val());
			}
		});
		return values;
	}

	/*
	 * 常量
	 */
	utils.AREA_CODE = {11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",5:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};
	utils.MONEY_NUMS = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
	utils.MONEY_DIGITS = new Array("", "拾", "佰", "仟");
	utils.MONEY_BIGUNITS = new Array("", "万", "亿", "万亿", "仟兆");
	utils.MONEY_SHOWNAME = new Array("分", "角", "圆");

	utils.MONEY_POSTFIX = "整";
	utils.DATETIME_FORMAT = "yyyymmddhhmiss";
	utils.TIME_FORMAT = "hhmiss";
	utils.TIME_FORMAT_DISPLAY = "hh:mi:ss";
	utils.DATE_FORMAT = "yyyymmdd";
	utils.DATE_FORMAT_DISPLAY = "yyyy年mm月dd日";
	utils.DATE_FORMAT_SHOW = "yyyy-mm-dd";
	utils.CURRENCY_NO_DOT = true; //后台返回的金额是否没有小数点

	/**
	 * 正则表达式定义
	 */
	utils.REGEXP_INTEGER = new RegExp(/^[0-9]+$/);
	utils.REGEXP_FLOAT = new RegExp(/^([0-9]+(\.+))[0-9]+$/);
	utils.REGEXP_DECIMAL = new RegExp(/^([0-9]+(\.?))?[0-9]+$/);
//	utils.REGEXP_MONEY = new RegExp(/^[0-9]*\.?[0-9]{0,2}$/);
	utils.REGEXP_MONEY = new RegExp(/^((\d{1,3}(\,\d{3})*)|\d*)?(\.\d*)?$/);
	utils.REGEXP_COMMA = new RegExp('\,', ["g"]);
	utils.REGEXP_DOT = new RegExp('\\.', ["g"]);
	utils.REGEXP_EMAIL = new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/);
	utils.REGEXP_DATE = new RegExp(/(yyyy|mm|dd|hh|mi|ss|ms)/gi);
	utils.REGEXP_PHONE = new RegExp(/^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/);
	utils.REGEXP_MOBILE = new RegExp(/^(13[0-9]|15[7-9]|15[0-2]|18[6-9])[0-9]{8}$/);
	utils.REGEXP_ACCOUNT = new RegExp(/^[0-9]{12,16}$/);

	/**
	 * @namespace String
	 * @desc String类的命名空间
	 */
	/**
	 * @namespace Date
	 * @desc Date类的命名空间
	 */
	
	/**
	 * @memberof String
	 * @desc 把string复制times遍
	 * @func times
	 * @instance
	 * @param {int} times - 次数
	 * @returns {string}
	 * @example var s = 'a'.times(3); // s = 'aaa'
	 */
	String.prototype.times = function(times){
		if(times < 1){
			times = 1;
		}
		var ret = "";
		while(times){
			ret += this;
			times--;
		}
		return ret;
	};
	
	 
	/**
	 * @memberof String
	 * @desc 字符串左补0到指定位数
	 * @func leftPadZero
	 * @instance
	 * @param {int} width - 指定字符串length位数
	 * @returns {string} 
	 * @example var s = 'test'.leftPadZero(6); //s = '00test'
	 */
	String.prototype.leftPadZero = function(width){
		var pad = width - this.length;
		if(pad > 0){
			return ("0".times(pad) + this);
		}else{
			return this;
		}
	};

	/**
	 * @memberof String
	 * @desc 是否以某字符串结尾
	 * @func endsWith
	 * @instance
	 * @param {string} pattern - 字符串
	 * @returns {boolean} 是否以给定的字符串结尾的布尔值 
	 * @example var end = 'test'.endsWith('st'); // end = true;
	 */
	String.prototype.endsWith = function(pattern){
		var d = this.length - pattern.length;
		return d >= 0 && this.lastIndexOf(pattern) === d;
	}
	
	/**
	 * @memberof Date
	 * @desc 将日期对象根据指定的格式格式化为字符串,格式为：yyyymmddhhmiss
	 * @func format
	 * @instance
	 * @param {string} format - 日期格式
	 * @returns {string}  
	 * @example var d = new Date();
	 * var fd = d.format('yyyymmdd'); // 返回年月日
	 */
	Date.prototype.format = function(format){
		if(!format){
			format = utils.DATE_FORMAT;
		}
		return format.replace(utils.REGEXP_DATE, function(str){
			switch(str.toLowerCase()){
			case 'yyyy':
				return this.getFullYear();
			case 'mm':
				return (this.getMonth() + 1).toString().leftPadZero(2);
			case 'dd':
				return this.getDate().toString().leftPadZero(2);
			case 'hh':
				return this.getHours().toString().leftPadZero(2);
			case 'mi':
				return this.getMinutes().toString().leftPadZero(2);
			case 'ss':
				return this.getSeconds().toString().leftPadZero(2);
			case 'ms':
				return this.getMilliseconds().toString().leftPadZero(3);
			}
		}.bind(this));
	};

	/**
	 * @memberof Date
	 * @desc 根据日期获取星期
	 * @func getWeek
	 * @instance
	 * @returns {string}  返回星期几
	 * @example var d = new Date();
	 * var week = d.getWeek(); // 返回星期几
	 */
	Date.prototype.getWeek = function(){
		var day = this.getDay();
		var weekName = "";
		switch(day){
		case 0:
			weekName = "周日";
			break;
		case 1:
			weekName = "周一";
			break;
		case 2:
			weekName = "周二";
			break;
		case 3:
			weekName = "周三";
			break;
		case 4:
			weekName = "周四";
			break;
		case 5:
			weekName = "周五";
			break;
		case 6:
			weekName = "周六";
			break;
		}
		return weekName;

	};
	
	/**
	 * @memberof Date
	 * @desc 比较日期是否为同一天
	 * @func isSameDay
	 * @instance
	 * @param {date} compareDate - 要比较的日期
	 * @returns {boolean} 
	 * @example var d1 = new Date();
	 * var d2 = new Date();
	 * d1.isSameDay(d2); // true;
	 */
	Date.prototype.isSameDay = function(compareDate){
		return (this.getFullYear() === compareDate.getFullYear() && this.getMonth() === compareDate.getMonth() && this.getDate() === compareDate.getDate());
	};

	/**
	 * @memberof Date
	 * @desc 取得当前日期的下一天
	 * @func nextDay
	 * @instance
	 * @returns {date}  
	 * @example var d1 = new Date(); //假如d1为1月2日
	 * var d2 = d1.nextDay(); //则d2为1月3日
	 */
	Date.prototype.nextDay = function(){
		return new Date(Date.parse(this) + 86400000);
	};

	/**
	 * @memberof Date
	 * @desc 取得当前日期的上一天
	 * @func previousDay
	 * @instance
	 * @returns {date}  
	 * @example var d1 = new Date(); //假如d1为1月2日
	 * var d2 = d1.previousDay(); //则d2为1月1日
	 */
	Date.prototype.previousDay = function(){
		return new Date(Date.parse(this) - 86400000);
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 检查字符串是否为空
	 * @func isEmpty
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean}  是否为空
	 * @example var s = '';
	 * Nuui.utils.isEmpty(s); //true;
	 * var s = ' ';
	 * Nuui.utils.isEmpty(s); //false;
	 */
	utils.isEmpty = function(s){
		return (s == null || s.length == 0);
	};

	 
	/**
	 * @memberof Nuui.utils
	 * @desc  检查字符串是否为正整数
	 * @func isInteger
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean}  是否为整数
	 * @example var s = '32';
	 * Nuui.utils.isInteger(s); //true;
	 */
	utils.isInteger = function(s){
		return (utils.REGEXP_INTEGER.test(s));
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 判断输入变量是否是浮点数（即小数点后有数字）
	 * @func isFloat
	 * @static
	 * @param {string} s - 要检查的变量值
	 * @returns {boolean}  是否为浮点数
	 * @example var f = '1.23';
	 * Nuui.utils.isFloat(f); //true;
	 */
	utils.isFloat = function(s){
		return (utils.REGEXP_FLOAT.test(s));
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 检查字符串是否为正数（整数或浮点数)
	 * @func isDecimal
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean}  是否为正数（整数或浮点数)
	 * @example var s = '-2.1';
	 * Nuui.utils.isDecimal(s); //false;
	 */
	utils.isDecimal = function(s){
		return (utils.REGEXP_DECIMAL.test(s));
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 检查字符串是否为合法的金额
	 * @func isMoney
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean}  是否为合法金额
	 * @example var m1 = '2,324,645.532';
	 * Nuui.utils.isMoney(m1); //true;
	 * var m2 = '2414323.143';
	 * Nuui.utils.isMoney(m2); //true;
	 */
	utils.isMoney = function(s){
		return (utils.REGEXP_MONEY.test(s));
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 检查字符串是否为合法的固定电话号码
	 * @func isPhone
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean}  是否为合法固定电话号码
	 * @example var p1 = '020-84763472';
	 * Nuui.utils.isPhone(p1); //true;
	 * var p2 = '0769-79344320-002';
	 * Nuui.utils.isPhone(p2); //true;
	 */
	utils.isPhone = function(s){
		return (utils.REGEXP_PHONE.test(s));
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  检查字符串是否为合法的手机号码
	 * @func isMobile
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean}  是否为合法手机号码
	 * @example var m1 = '13112345678';
	 * Nuui.utils.isMobile(m1); //true;
	 * var m2 = '15312345678';
	 * Nuui.utils.isMobile(m2); //false;
	 * 
	 */
	utils.isMobile = function(s){
		return (utils.REGEXP_MOBILE.test(s));
	};
	
	/**
	 * @memberof Nuui.utils
	 * @desc  检查字符串是否为合法的账号
	 * @func isAccount
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean}  是否为合法的账号
	 * @example var a = '5465 2354 2454325';
	 * Nuui.utils.isAccount(a); //true;
	 */
	utils.isAccount = function(s){
		s = $.trim(s.replace(/\s/g, ""))
		return (utils.REGEXP_ACCOUNT.test(s));
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  检查字符串是否全部为中文
	 * @func isChinese
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean}  是否全部为中文
	 * @example var c = '这个1是中文吗'; //是否都是中文字符，数字、空格和符号也不行
	 * Nuui.utils.isChinese(c); //false;
	 */
	utils.isChinese = function(s){
		for(var index = 0, len = s.length; index < len; index++){
			var charCode = s.charCodeAt(index);
			if((charCode < 19968) || (charCode > 40869)){
				return false;
			}
		}
		return true;
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  检查字符串是否为合法的Email
	 * @func isEmail
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean} 是否为合法Email
	 * @example var email = '134134134@qq.com';
	 * Nuui.utils.isEmail(email); //true;
	 */
	utils.isEmail = function(s){
		if(s.length > 50){
			return false;
		}
		return (utils.REGEXP_EMAIL.test(s));
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  检查字符串是否为合法的身份证号码
	 * @func isIDNumber
	 * @static
	 * @param {string} s - 字符串
	 * @returns {boolean} 是否为合法身份证号码
	 * @example var id = '430421197710177894';
	 * Nuui.utils.isIDNumber(id); //true;
	 */
	utils.isIDNumber = function(s){
		// 检查长度是否合法
		switch(s.length){
		case 15:
		case 18: {
			break;
		}
		default: {
			return false;
		}
		}
		// 检查是否为数字
		var testInt = (s.length == 15) ? s : s.substr(0, 17);
		if(!utils.isInteger(testInt)){
			return false;
		}
		// 检查区域代码是否合法
		var areaCode = parseInt(s.substr(0, 2));
		if(!utils.AREA_CODE[areaCode]){
			return false;
		}
		// 检查出生日期是否合法
		var birthDay = (s.length == 15) ? ("19" + s.substr(6, 6)) : s.substr(6, 8);
		if(!utils.isDate(birthDay, utils.DATE_FORMAT)){
			return false;
		}
		// 检查校验位是否合法
		if(s.length == 18){
			var testNumber = (parseInt(s.charAt(0)) + parseInt(s.charAt(10))) * 7 + (parseInt(s.charAt(1)) + parseInt(s.charAt(11))) * 9 + (parseInt(s.charAt(2)) + parseInt(s.charAt(12))) * 10 + (parseInt(s.charAt(3)) + parseInt(s.charAt(13))) * 5 + (parseInt(s.charAt(4)) + parseInt(s.charAt(14))) * 8 + (parseInt(s.charAt(5)) + parseInt(s.charAt(15))) * 4 + (parseInt(s.charAt(6)) + parseInt(s.charAt(16))) * 2 + parseInt(s.charAt(7)) * 1 + parseInt(s.charAt(8)) * 6 + parseInt(s.charAt(9)) * 3;
			if(s.charAt(17) != "10X98765432".charAt(testNumber % 11)){
				return false;
			}
		}
		return true;
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  根据指定的日期格式解析日期
	 * @func parseDate
	 * @static
	 * @param {string} dateString  - 日期字符串
	 * @param {string} format -  日期格式，例如 YYYYMMDD, yyyy年mm月dd日
	 * @returns {date} 解析后的日期，如果日期格式非法，则返回null
	 * @example var dateString = '2015/08/24';
	 * var format = 'yyyy/mm/dd'; //dateString 对应的格式
	 * //返回一个dateString 对应的Date格式的对象
	 * var d = Nuui.utils.parseDate(dateString,format); 
	 */
	utils.parseDate = function(dateString, format){
		var year = 2000, month = 0, day = 1, hour = 0, minute = 0, second = 0;
		format = format || utils.DATE_FORMAT_SHOW;
		
		if(dateString.length !== format.length){
			console.log("日期和日期对应格式的长度不一致！");
			return null;
		}else{
			if(!utils.isDate(dateString, format)){
				console.log("日期或格式不合法！");
				return null;
			}
		}
		var matchArray = format.match(utils.REGEXP_DATE);
		for(var i = 0; i < matchArray.length; i++){
			var postion = format.indexOf(matchArray[i]);
			switch(matchArray[i]){
			case "yyyy": {
				year = parseInt(dateString.substr(postion, 4), 10);
				break;
			}
			case "mm": {
				month = parseInt(dateString.substr(postion, 2), 10) - 1;
				break;
			}
			case "dd": {
				day = parseInt(dateString.substr(postion, 2), 10);
				break;
			}
			case "hh": {
				hour = parseInt(dateString.substr(postion, 2), 10);
				break;
			}
			case "mi": {
				minute = parseInt(dateString.substr(postion, 2), 10);
				break;
			}
			case "ss": {
				second = parseInt(dateString.substr(postion, 2), 10);
				break;
			}
			}
		}

		var result = new Date(year, month, day, hour, minute, second);

		// 加上result为空的判断,为了解决传入的字符串格式不正确的问题
		// IE下用isNaN来判断，其它浏览器通过Invalid Date来判断
		// Updated by zhuding@yuchengtech on 2011-2-28
		if(result == "Invalid Date" || isNaN(result))
			return null;

		return result;
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  检查字符串是否为合法的日期格式
	 * @func isDate
	 * @static
	 * @param {string} dateString -  字符串
	 * @param {string} format  - 日期格式，例如 YYYYMMDD, yyyy年mm月dd日
	 * @returns {boolean} 是否为合法日期
	 * @example var dateString = '2015/08/24';//日和月都必须是两位
	 * var format = 'yyyy/mm/dd'; //dateString 对应的格式
	 * //返回一个boolean,判断字符串用对应格式转完是不是一个日期格式
	 * var d = Nuui.utils.isDate(dateString,format); 
	 */
	utils.isDate = function(dateString, format){
		var year, month, day;
		format = format || utils.DATE_FORMAT_SHOW;
		
		if(dateString.length !== format.length){
			console.log( "日期和日期对应的格式不对或者长度不对！");
			return false;
		}
		
		var matchArray = format.match(utils.REGEXP_DATE);
		for(var i = 0; i < matchArray.length; i++){
			var postion = format.indexOf(matchArray[i]);
			switch(matchArray[i]){
			case "yyyy": {
				year = parseInt(dateString.substr(postion, 4), 10);
				break;
			}
			case "mm": {
				month = parseInt(dateString.substr(postion, 2), 10) - 1;
				break;
			}
			case "dd": {
				day = parseInt(dateString.substr(postion, 2), 10);
				break;
			}
			}
		}
		var dateTest = new Date(year, month, day);
		var testYear = dateTest.getFullYear();
		var testMonth = dateTest.getMonth();
		var testDay = dateTest.getDate();
		return (year == testYear && month == testMonth && day == testDay);
	};
	/**
	 * @memberof Nuui.utils
	 * @desc 将标准格式的日期格式化为中文日期字符串
	 * @func formatDate
	 * @static
	 * @param {string} data -  输入的日期字符串，格式为utils.DATE_FORMAT 定义的格式
	 * @param {string} outFormat  - 输出的日期格式，例如 utils.DATE_FORMAT_SHOW
	 * @returns {string}  格式化后的字符串
	 * @example var data = '2015/08/24';//与inFormat的格式相互对应
	 * var inFormat = 'yyyy/mm/dd'; //data 对应的格式，用来返回一个Date对象
	 * var outFormat = 'yyyy-mm-dd'; //对返回的Date对象格式化后输出
	 * Nuui.utils.formatDate(data,inFormat,outFormat); //2015-08-24
	 * 
	 */
	utils.formatDate = function(data, inFormat, outFormat){
		// 如果data为空,则返回空字符串
		// Added by zhuding@yuchengtech.com o 2011-03-15
		if(!data)
			return "";
		var parsedDate = utils.parseDate(data, inFormat || utils.DATE_FORMAT);
		// 如果输入的data不合法,则返回空字符串
		// Added by zhuding@yuchengtech.com o 2011-03-15
		if(parsedDate == null)
			return "";
		if(outFormat && typeof outFormat === "string"){
			return parsedDate.format(outFormat);
		}else{
			return parsedDate.format(utils.DATE_FORMAT_SHOW);
		}
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  数据格式化函数： hhmiss 格式的时间
	 * @func formatTime
	 * @static
	 * @param {string} data -  输入的时间字符串
	 * @param {string} format -  输出的时间格式
	 * @returns {string}  格式化后的字符串
	 * @example var time = '161311'; //输入hhmiss格式的time字符串
	 * var format = 'hh时mi分'; //定义输入的时间格式
	 * Nuui.utils.formatTime(time,format); //16时13分
	 */
	utils.formatTime = function(data, format){
		var parsedDate = utils.parseDate(data, utils.TIME_FORMAT);
		if(parseDate == null ){
			return "";
		}
		if(format && typeof format === "string"){
			return parsedDate.format(format);
		}else{
			return parsedDate.format(utils.TIME_FORMAT_DISPLAY);
		}
	};

	/**
	 * @memberof Nuui.utils
	 * @desc   数据格式化函数：YYYYMMDDhhmiss 格式的时间
	 * @func formatDateTime
	 * @static
	 * @param {string} data 输入的日期字符串
	 * @param {string} format 输出的日期格式
	 * @returns {string} 格式化后的字符串
	 * @example var date = '20150824162511'; //只能是yyyymmddhhmiss格式的时间字符串(24时制)
	 * var format = 'yyyy年mm月dd日hh时mi分'; //定义输出的日期格式
	 * Nuui.utils.formatDateTime(date,format); //2015年08月24日16时25分
	 * 
	 */
	utils.formatDateTime = function(data, format){
		var parseDate = utils.parseDate(data, utils.DATETIME_FORMAT);
		if(parseDate == null){
			return "";
		}
		if(format && typeof format === "string"){
			return parseDate.format(format);
		}else{
			return parseDate.format(utils.DATE_FORMAT_SHOW + " " + utils.TIME_FORMAT_DISPLAY);
		}
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  转换为中文金额表示
	 * @func formatDateTime
	 * @static
	 * @param {string} cash 要转换的金额字符串，默认被省略"."后的值，除非里面有"."
	 * @returns {string} 转换后的金额字符串
	 * @example var cash = '2,4231.12'; //数字金额
	 * Nuui.utils.toChineseCash(cash); //贰万肆仟贰佰叁拾壹圆壹角贰分
	 */
	utils.toChineseCash = function(cash){
		if(utils.isEmpty(cash)){
			return '';
		}
		var noCommaCash = utils._prepareCashString(cash);
		if(parseFloat(cash) == 0){
			return '';
		}
		if(utils.isInteger(noCommaCash)){
			return utils.convertIntegerToChineseCash(noCommaCash);
		}
		var dotIndex = noCommaCash.indexOf('.');
		var integerCash = noCommaCash.substring(0, dotIndex);
		var decimalCash = noCommaCash.substring(dotIndex + 1);
		var result = "";
		if(!utils.isEmpty(integerCash)){
			result += utils.convertIntegerToChineseCash(integerCash);
		}
		if(!utils.isEmpty(decimalCash)){
			result += utils.convertDecimalToChineseCash(decimalCash);
		}
		return result;
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 整数部分转换为中文金额表示
	 * @func convertIntegerToChineseCash
	 * @static
	 * @param {string} cash  - 要转换的金额字符串
	 * @returns {string} 转换后的金额字符串
	 * @example var cash = '24231'; //只能是整数，表示金额的整数部分，不能有 , 号和 . 号
	 * Nuui.utils.convertIntegerToChineseCash(cash); //贰万肆仟贰佰叁拾壹圆
	 */
	utils.convertIntegerToChineseCash = function(cash){
		if(cash == "0")
			return "";
		var S = ""; //返回值 
		var p = 0; //字符位置指针 
		var m = cash.length % 4; //取模 

		// 四位一组得到组数 
		var k = (m > 0 ? Math.floor(cash.length / 4) + 1 : Math.floor(cash.length / 4));
		// 外层循环在所有组中循环
		// 从左到右 高位到低位 四位一组 逐组处理 
		// 每组最后加上一个单位: "[万亿]","[亿]","[万]" 
		for(var i = k; i > 0; i--){
			var L = 4;
			if(i == k && m != 0){
				L = m;
			}
			// 得到一组四位数 最高位组有可能不足四位 
			var s = cash.substring(p, p + L);
			var l = s.length;

			// 内层循环在该组中的每一位数上循环 从左到右 高位到低位 
			for(var j = 0; j < l; j++){
				var n = parseInt(s.substring(j, j + 1));
				if(n == 0){
					if((j < l - 1) && (parseInt(s.substring(j + 1, j + 1 + 1)) > 0) //后一位(右低) 
							&& S.substring(S.length - 1, S.length) != utils.MONEY_NUMS[n]){
						S += utils.MONEY_NUMS[n];
					}
				}else{
					//处理 1013 一千零"十三", 1113 一千一百"一十三" 
					if(!(n == 1 && (S.substring(S.length - 1, S.length) == utils.MONEY_NUMS[0] | S.length == 0) && j == l - 2)){
						S += utils.MONEY_NUMS[n];
					}
					S += utils.MONEY_DIGITS[l - j - 1];
				}
			}
			p += L;
			// 每组最后加上一个单位: [万],[亿] 等 
			if(i < k){
				//不是最高位的一组 
				if(parseInt(s) != 0){
					//如果所有 4 位不全是 0 则加上单位 [万],[亿] 等 
					S += utils.MONEY_BIGUNITS[i - 1];
				}
			}else{
				//处理最高位的一组,最后必须加上单位 
				S += utils.MONEY_BIGUNITS[i - 1];
			}
		}
		return S + utils.MONEY_SHOWNAME[2];
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 小数部分转换为中文金额表示
	 * @func convertDecimalToChineseCash
	 * @static
	 * @param {string} cash -  要转换的金额字符串
	 * @returns {string} 转换后的金额字符串
	 * @example var cash = '24'; //只能是整数，表示金额的小数部分，不能有 , 号和 . 号
	 * Nuui.utils.convertDecimalToChineseCash(cash); //贰角肆分
	 */
	utils.convertDecimalToChineseCash = function(cash){
		var returnCash = "";
		if(cash == "00"){
			returnCash = utils.MONEY_POSTFIX;
		}else{
			for(var i = 0; i < cash.length; i++){
				if(i >= 2){
					break;
				}
				var intValue = parseInt(cash.charAt(i));
				switch(i){
				case 0: {
					if(intValue != 0){
						returnCash += utils.MONEY_NUMS[intValue] + utils.MONEY_SHOWNAME[1];
					}
					break;
				}
				case 1: {
					returnCash += utils.MONEY_NUMS[intValue] + utils.MONEY_SHOWNAME[0];
					break;
				}
				default:
					break;
				}
			}
		}
		return returnCash;
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 向整数金额添加逗号分隔符
	 * @func addComma
	 * @static
	 * @param {string} str  - 要转换的金额字符串
	 * @returns {string} 转换后的金额字符串
	 * @example var str = '32672437647'; //只能是整数，表示金额的整数部分，不能有 , 号和 . 号
	 * Nuui.utils.addComma(str); //32,672,437,647
	 */
	utils.addComma = function(str){
		if(str.length > 3){
			var mod = str.length % 3;
			var output = (mod > 0 ? (str.substring(0, mod)) : '');
			for(i = 0; i < Math.floor(str.length / 3); i++){
				if((mod == 0) && (i == 0))
					output += str.substring(mod + 3 * i, mod + 3 * i + 3);
				else
					output += ',' + str.substring(mod + 3 * i, mod + 3 * i + 3);
			}
			return (output);
		}else
			return str;
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 从金额中删除逗号分隔符
	 * @func removeComma
	 * @static
	 * @param {string} str -  要转换的金额字符串
	 * @returns {string} 转换后的金额字符串
	 * @example var str = '32,672,437,647.123'; //含 , 号的金额字符串
	 * Nuui.utils.removeComma(str); //32672437647.123
	 */
	utils.removeComma = function(str){
		return str.replace(utils.REGEXP_COMMA, '');
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 从金额中删除 . 号
	 * @func removeDot
	 * @static
	 * @param {string} str -  要转换的金额字符串
	 * @returns {string} 转换后的金额字符串
	 * @example var str = '32,672,437,647.123'; //含 . 号的金额字符串
	 * Nuui.utils.removeDot(str); //32,672,437,647123 
	 */
	utils.removeDot = function(str){
		return str.replace(utils.REGEXP_DOT, '');
	};
	/**
	 * @memberof Nuui.utils
	 * @desc 从金额中删除 . 号和 , 号
	 * @func removeDotAndComma
	 * @static
	 * @param {string} str  - 要转换的金额字符串
	 * @returns {string} 转换后的金额字符串
	 * @example var str = '32,672,437,647.123'; //含 . 号和 , 号的金额字符串
	 * Nuui.utils.removeDotAndComma(str); //32672437647123 
	 */
	utils.removeDotAndComma = function(str){
		return str.replace(utils.REGEXP_DOT, '').replace(utils.REGEXP_COMMA, '');
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 为传入的整数添加小数点并返回，如果传入的字符串为空或者非整数，则返回原输入字符串。
	 * 例如addDot("123", 2)->"1.23"，addDot("123", 5)->"0.00123"
	 * @func addDot
	 * @static
	 * @param {string} str -  要转换的金额字符串，如果传入参数中有金额小数点，会被忽略掉
	 * @param {int} digits  小数位数
	 * @returns {string} 添加小数点后的字符串
	 * @example Nuui.utils.addDot("123", 2); //1.23
	 */
	utils.addDot = function(str, digits){
		// TODO:实现方式需要_prepareCashString统一
		if(!utils.isInteger($.trim(str)))
			return str;
		var value = utils.removeDot($.trim(str));
		if(value.length <= digits){
			value = value.leftPadZero(digits + 1);
		}
		return value.substring(0, value.length - digits) + "." + value.substr(value.length - digits);
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 将金额转换为带逗号分隔符的格式，补齐小数位数
	 * @func toCashWithComma
	 * @static
	 * @param {string} cash  - 要转换的金额字符串
	 * @param {boolean} dot -  原值是否包含小数点(true=没省略小数点的金额，false=省略小数点后的金额)
	 * @param {int} digits  - 小数位数
	 * @returns {string} 转换后的金额字符串
	 * @example Nuui.utils.toCashWithComma('1234567', true, 2); //原值是没省略小数点的，返回1,234,567.00
	 * Nuui.utils.toCashWithComma('123456', false, 2); //原值是省略小数点的，返回12,345.67
	 * //原值带小数点，返回原值，用0补齐小数点位数，或者截掉多的位数
	 * Nuui.utils.toCashWithComma('1234.5', false, 3); //1234.500
	 * Nuui.utils.toCashWithComma('1234.5678', false, 2); //1234.56
	 */
	utils.toCashWithComma = function(cash, dot, digits){
		if("" == cash || null == cash){
			return "";
		}
		
		var temp = utils._prepareCashString(cash, dot, digits);

		var dotPos = temp.indexOf('.');
		var integerCash = temp.substring(0, dotPos);
		var decimalCash = temp.substring(dotPos + 1);

		// 处理包含正负符号的情况
		var prefix = integerCash.charAt(0);
		if(prefix == "-" || prefix == "+"){
			temp = prefix + utils.addComma(integerCash.substring(1)) + '.' + decimalCash;
		}else{
			temp = utils.addComma(integerCash) + '.' + decimalCash;
		}

		return temp;
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 将输入值转换为真实金额大小，补齐小数位数
	 * @func _prepareCashString
	 * @static
	 * @private
	 * @param {string} cash  - 要转换的金额字符串
	 * @param {boolean} dot -  原值是否包含小数点(true=真实金额大小，false=不存储小数点格式)
	 * @param {int} digits  - 小数位数
	 * @returns {string} 转换后的金额字符串
	 */
	utils._prepareCashString = function(cash, dot, digits){

		if(cash == undefined)
			cash = '0';
		// Modified by zhuding@yuchengtech.com on 2011-03-29
		// 将缺省的dot改为!utils.CURRENCY_NO_DOT，
		// 同时加入dot是否为布尔量的判断，解决liana_table在调用format.formatter( keyData, kcoll )时第二个参数是kcoll，而被误识别的问题
		if(dot == undefined || (dot !== true && dot !== false))
			dot = !utils.CURRENCY_NO_DOT;
		if(digits == undefined)
			digits = 2;

		if(typeof cash !== "string"){
			cash = cash.toString();
		}
		cash = utils.removeComma(cash);

		//TODO检查是否金额

		// 处理包含正负符号的情况
		var prefix = cash.charAt(0);
		if(prefix == "-" || prefix == "+"){
			return prefix + utils._prepareCashString(cash.substr(1), dot, digits);
		}

		if(cash.indexOf('.') != -1){
			dot = true; //如果输入串本身包含小数点，则忽略dot参数的设置，认为是真实金额大小
		}
		var integerCash, decimalCash;
		if(!dot){
			if(cash.length <= digits){
				cash = cash.leftPadZero(digits + 1);
			}
			integerCash = cash.substring(0, cash.length - digits);
			decimalCash = cash.substring(cash.length - digits);
		}else{
			var dotPos = cash.indexOf('.');
			if(dotPos != -1){
				integerCash = cash.substring(0, dotPos);
				decimalCash = cash.substring(dotPos + 1);
			}else{
				integerCash = cash;
				decimalCash = '';
			}
			if(integerCash.length == 0)
				integerCash = '0';
			if(decimalCash.length < digits){
				decimalCash += '0'.times(digits - decimalCash.length);
			}else{
				decimalCash = decimalCash.substring(0, digits); //TODO 考虑四舍五入
			}
		}

		//去掉头部多余的0
		while(integerCash.charAt(0) == '0' && integerCash.length > 1){
			integerCash = integerCash.substring(1);
		}
		cash = integerCash + '.' + decimalCash;

		return cash;
	};

	/**
	 * @memberof Nuui.utils
	 * @desc 将数字转换为百分率，例如0.8--> 80%
	 * @func toPercent
	 * @static
	 * @param {float} input  - 要转换的数字
	 * @param {int} accuracy  - 百分率的精度，即小数点后保留多少位。例如accuracy=2，0.812345--> 81.23%
	 * @returns {string} 转换后的字符串
	 * @example Nuui.utils.toPercent(1.18769,2); //截取两位小数，返回 118.76%
	 */
	utils.toPercent = function(input, accuracy){
		input = parseFloat(input);
		var resultString = (input * 100).toString();
		var dotPosition = resultString.indexOf(".");
		if(dotPosition > 0){
			resultString = resultString.substring(0, dotPosition + accuracy + 1);
		}
		return resultString + "%";
	};

	
	/**
	 * @memberof Nuui.utils
	 * @desc 对手机号码进行掩码处理
	 * @func maskPhone
	 * @static
	 * @param {string} string  - 手机号码
	 * @returns {string} 进行掩码处理后的手机号
	 * @example //注意提供的手机号码要有效，无效号码也会进行同样的掩码处理。
	 * Nuui.utils.maskPhone('13512346410'); //进行掩码，返回135****6410。
	 */
	utils.maskPhone = function(phone){
		if(phone){
			var phone = phone.replace(/\s/g, "");
			return phone.substr(0, 3) + "****" + phone.substr(phone.length - 4, 4);
		}
	};
	/**
	 * @memberof Nuui.utils
	 * @desc 对Email地址进行掩码处理
	 * @func maskEmail
	 * @static
	 * @param {string} email -  Email地址
	 * @returns {string} 进行掩码处理后Email地址
	 * @example //注意提供的Email的有效性，无效Email也会进行掩码处理
	 * var email = '123123123@qq.com';
	 * Nuui.utils.maskEmail(email);//12****@qq.com
	 */
	utils.maskEmail = function(email){
		if(email){
			var email = email.replace(/\s/g, "");
			var name = email.split("@")[0];
			var url = email.split("@")[1];
			var mask = "";
			for(var i = 0; i < name.length - 2; i++){
				mask += "*";
			}
			if(name.length > 2){
				return name.substr(0, 2) + mask +"@" + url;
			}else{
				return name.substr(0, 1) + mask.substr(1) +"@" + url;
			}
		}
	};
	/**
	 * @memberof Nuui.utils
	 * @desc 对银行账号进行掩码处理
	 * @func maskAccount
	 * @static
	 * @param {string} accNo -  银行账号
	 * @returns {string} 进行掩码处理后的账号
	 * @example //注意提供的account的有效性，无效account也会进行掩码
	 * Nuui.utils.maskAccount('6781481478134'); //6781****8134
	 */
	utils.maskAccount = function(accNo){
		try{
			var accNo = accNo.replace(/\s/g, "");
			var numLength = accNo.length;
			if(numLength < 8){
				return accNo;
			}
			return accNo.substr(0, 4) + "****" + accNo.substr(accNo.length - 4, 4);
		}catch(err){
			return accNo;
		}
	};
	
	/**
	 * @memberof Nuui.utils
	 * @desc 格式化银行账号(每隔4位加一个空格)
	 * @func formatAccount
	 * @static
	 * @param {string} accNo -  银行账号
	 * @returns {string} 格式化后的账号
	 * @example //注意account的有效性，无效的account也会进行格式化
	 * Nuui.utils.formatAccount('5235424546254314'); //5235 4245 4625 4314
	 */
	utils.formatAccount = function(accNo){
		var formatAcc = "";
		if(!accNo || $.trim(accNo) === ""){
			return formatAcc;
		}
		var accNo = $.trim(accNo.replace(/\s/g, ""));
		var accLength = accNo.length;
		var accArray = [];
		// 获取需要的空格数
		var spaceCount = (accLength % 4 == 0) ? parseInt(accLength / 4) - 1 : parseInt(accLength / 4);
		for(var i = 0; i < spaceCount; i++){
			// 每4位数添加进数组
			var fourNumbers = accNo.substr(i * 4, 4);
			accArray.push(fourNumbers);
		}
		// 添加最后的几位数（1~4位）
		accArray.push(accNo.substring(spaceCount * 4, accLength));

		// 组装成格式化账号
		formatAcc = accArray.join(" ");

		return formatAcc;
	};
	
	/**
	 * @memberof Nuui.utils
	 * @desc 反格式化银行账号(去除空格)
	 * @func unformatAccount
	 * @static
	 * @param {string} accNo -  银行账号
	 * @returns {string} 反格式化后的账号
	 * @example //注意account的有效性，无效的account也会进行处理，本处理是去掉account中的空格而已
	 * Nuui.utils.unformatAccount('5235 4245 4625 4314'); //5235424546254314
	 */
	utils.unformatAccount = function(accNo){
		return $.trim(accNo.replace(/\s/g, ""));
	};
	
	/**
	 * @memberof Nuui.utils
	 * @desc 为元素渲染金额格式化效果
	 * @func renderMoney
	 * @static
	 * @param {$} $element  -  input性质的元素
	 * @param {$} $upperElement  -  显示大写金额区域,span性质的元素
	 * @example //把id为transferAmt的input金额的数字值转换为中文大写显示在id为upperAmt的<span>里面
	 * Nuui.utils.renderMoney(view.$("#transferAmt"), view.$("#upperAmt"));
	 */
	utils.renderMoney = function($element, $upperElement){

		$element.blur(function(){
			var value = $(this).val();
			if(utils.isMoney(value)){
				$(this).val(utils.toCashWithComma(value, true));
				if($upperElement){
					$upperElement.html(utils.toChineseCash($(this).val()));
				}
			}else{
				if($upperElement){
					$upperElement.html("");
				}
			}
		});
	};
	
	/**
	 * @memberof Nuui.utils
	 * @desc 为元素渲染账号格式化效果
	 * @func renderAccount
	 * @static
	 * @param {$} $element  -  input性质的元素
	 * @example //把id为recAccount的输入框的值，格式化为账号效果
	 * Nuui.utils.renderAccount(view.$("#recAccount"));
	 */
	utils.renderAccount = function($element){
		$element.blur(function(){
			var value = $(this).val();
			if(utils.isAccount(value)){
				$(this).val(utils.formatAccount(value));
			}
		});
	};
	
	/**
	 * @memberof Nuui.utils
	 * @desc 为元素增加触摸时的active效果,需要相应的css支持<br/>
	 * 		因为在移动端不是使用原生的click事件,一般是用第三方的tap库<br/>
	 * 		而tap库会存在一些问题,导致必须在事件中return false防止事件继续触发,此时:active伪类就会无效<br/>
	 * 		因此用此函数绑定touchstart和touchend事件,手工增加和去除active样式,需要样式支持<br/>
	 * @func bindActive
	 * @static
	 * @param {$} $el - 需要渲染active效果的元素
	 * @example Nuui.utils.bindActive(view.$(".index_box li"));
	 */
	utils.bindActive = function($el){
		var beginEvent = ("ontouchstart" in document) ? "touchstart" : "mousedown";
		var endEvent = ("ontouchend" in document) ? "touchend" : "mouseup";
		
		$el.bind(beginEvent, function(){
			$(this).addClass("active");
		}).bind(endEvent, function(){
			$(this).removeClass("active");
		})
	};
	
	/**
	 * @memberof Nuui.utils
	 * @desc 弹出提示框
	 * @func alert
	 * @static
	 * @param {string} message  -  弹出框的提示信息内容
	 * @param {object} options - 配置
	 * @param {string} options.title - 提示框的title,默认“提示”。</br>
	 * @param {string} options.confirmButContent - 确定按钮的内容，默认“确定”。</br>
	 * @param {func} callback   - 点击确认按钮后回调的函数。
	 * @example Nuui.utils.alert('您当前选中的值是0', {
	 * 		title:'提示信息',
	 * 		confirmButContent:'确认'
	 * 		}, function(){
	 * 		console.log('ok!');
	 * });
	 */
	utils.alert = function(message, options, callback){
		if(_.isFunction(options)){
			callback = options;
		}
		var _options = {
			title:"提示",
			confirmButContent:"确定"
		}
		if(options){
			_.extend(_options, options);
		}
		var dialogHtml = [
			"<div class='nu-dialog table z1500'>",
				"<div class='table-row'>",
					"<div class='table-cell-center'>",
						"<div class='nu-dialog-container'>",
							"<div class='nu-dialog-title'>" + _options.title + "</div>",
							"<div class='nu-dialog-content'><span>" + message + "</span></div>",
							"<div class='nu-dialog-button-area'>",
								"<button id='_dialogConfirm'>" + _options.confirmButContent + "</button>",
							"</div>",
						"</div>",
					"</div>",
				"</div>",
			"</div>"
		].join("");
		var dialog = $(dialogHtml)
			.css({
				transition: "all 0.1s ease-in-out",
				opacity:0
			})
			.appendTo(document.body);

		setTimeout(function(){
			dialog.css('opacity', 1);
		},5);

		dialog.find("#_dialogConfirm").on("tap", function(){
				dialog.remove();
				if(callback){
					callback();
				}
				return false;
		});



	};

	/**
	 * @memberof Nuui.utils
	 * @desc  弹出确认框，确认是否继续执行
	 * @func confirm
	 * @static
	 * @param {string} message - 确认框的提示信息内容
	 * @param {object} options - 配置
	 * @param {string} options.title  - 确认框的title,默认“确认”。</br>
	 * @param {string} options.confirmButContent - 确认按钮的内容，默认“确定”。</br>
	 * @param {string} options.cancelButContent - 取消按钮的内容，默认“取消”。
	 * @param {func} callback  -点击确认按钮后回调的函数。
	 * @example Nuui.utils.confirm('您确定要继续执行吗？', {
	 * 		title:'确认信息',
	 * 		confirmButContent:'确认',
	 * 		cancelButContent:'放弃'
	 * 		}, function(state){
	 * 		if(state){
	 * 		console.log("yes");
	 * 		}else{
	 * 		console.log("cancel");}
	 * });
	 */
	utils.confirm = function(message, options, callback){
		if(_.isFunction(options)){
			callback = options;
		}
		var _options = {
			title:"确认",
			confirmButContent:"确定",
			cancelButContent:"取消"
		}
		if(options){
			_.extend(_options, options);
		}
		var dialogHtml = [
			"<div class='nu-dialog table z1500'>",
				"<div class='table-row'>",
					"<div class='table-cell-center'>",
						"<div class='nu-dialog-container'>",
						/*	"<div class='nu-dialog-title'>" + _options.title + "</div>",*/
							"<div class='nu-dialog-content'><span>" + message + "</span></div>",
							"<div class='nu-dialog-button-area'>",
								"<button id='_dialogConfirm'>" + _options.confirmButContent + "</button>",
								"<button id='_dialogCancel'>" + _options.cancelButContent + "</button>",
							"</div>",
						"</div>",
					"</div>",
				"</div>",
			"</div>"
		].join("");

		var dialog = $(dialogHtml)
			.css({
				transition: "all 0.1s ease-in-out",
				opacity:0
			})
			.appendTo(document.body);

		setTimeout(function(){
			dialog.css('opacity', 1);
		},5);

		dialog.find("#_dialogConfirm").on("tap", function(){
			dialog.remove();
			if(callback){
				callback(true);
			}
			return false;
		});
		dialog.find("#_dialogCancel").on("tap", function(){
			dialog.remove();
			if(callback){
				callback(false);
			}
			return false;
		});
	};

	/**
	 * @memberof Nuui.utils
	 * @desc  弹出toast提示框，默认2秒后消失
	 * @func toast
	 * @static
	 * @param {string} message - 提示信息内容
	 * @param {object} options - 配置
	 * @param {string} options.title - 标题,默认为"提示"</br>
	 * @param {int} options.duration - 显示提示框的毫秒数,默认"2000"</br>
	 * @example Nuui.utils.toast("23", {duration:1000})
	 */
	utils.toast = function(message, options){
		var _options = {
			title:"提示",
			duration:2000
		}
		if(options){
			_.extend(_options, options);
		}
		var duration = _options.duration;
		var title = _options.title;
		
		var dialogHtml = [
			"<div class='nu-dialog table z1500'>",
				"<div class='table-row'>",
					"<div class='table-cell-center'>",
						"<div id='toast-container' class='nu-dialog-container'>",
						/*	"<div class='nu-dialog-title'>" + title + "</div>",*/
							"<div class='nu-dialog-content'><span>" + message + "</span></div>",
						"</div>",
					"</div>",
				"</div>",
			"</div>"
		].join("");
		var dialog = $(dialogHtml).appendTo(document.body);
		dialog.fadeOut(duration);
		setTimeout(function(){
			dialog.remove();
		} , duration);
	};

	
	/**
	 * @memberof Nuui.utils
	 * @desc  渲染数字滚动效果
	 * @func countable
	 * @static
	 * @param {$} $dom - 被渲染的jQuery对象
	 * @param {string} startnumber - 起始数字,字符串形式
	 * @param {string} endnumber  - 结束数字,字符串形式
	 * @param {int} digits - 保留小数位数,默认为0
	 * @param {int} time - 滚动时间,单位为毫秒,默认为500
	 * @param {int} timesub - 间隔时间(降级方案使用),默认为
	 * @example Nuui.utils.countable($('.counter'), '0', '99', 2);
	 */
	utils.countable = function($dom, startnumber, endnumber, digits, time, timesub){
		requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
		digits = digits || 0;
		time = time || 500;
		timesub = timesub || 30;
		startnumber = parseFloat(startnumber);
		endnumber = parseFloat(endnumber);

		if(requestAnimationFrame){
			// 优先选用requestAnimationFrame
			var startpoint;
			var running = function(timing){
				startpoint = startpoint ? startpoint : timing;
				var percent = (timing - startpoint) / time;
				var update = percent * (endnumber - startnumber) + startnumber;
				if(percent >= 1) {
					$dom.text(endnumber.toFixed(digits));
				} else {
					$dom.text(update.toFixed(digits));
					requestAnimationFrame(running);
				}
			};
			requestAnimationFrame(running);
		} else {
			// 若浏览器不支持requestAnimationFrame,降级使用setInterval
			var times = time / timesub, intervalNumber = (endnumber - startnumber) / times;
			var countableInterval = setInterval(function(){
				startnumber += intervalNumber;
				if(startnumber >= endnumber ){
					$dom.text(endnumber.toFixed(digits));
					clearInterval(countableInterval);
				} else {
					$dom.text(startnumber.toFixed(digits));
				}
			}, timesub);
		}
	};
	/**
	 * @memberof Nuui.utils
	 * @desc  获取中间显示区域container的高度
	 * @func getContainerHeight
	 * @static
	 * @example Nuui.utils.getContainerHeight();
	 */
	utils.getContainerHeight = function(){
		var cHeight = $("#app-container").outerHeight(true);
		var hHeight = parseInt($(".app-page").css("padding-top"));
		var fHeight = parseInt($(".app-page").css("padding-bottom"));
		return cHeight - hHeight - fHeight;
	};

	if(window.$){
		/**
		 * @memberof $
		 * @desc 对$.fn对象扩展, 对$对象添加css动画Transforms的兼容方法
		 * @func transform
		 * @static
		 * @param {string} transform - 被渲染的transform值, 覆盖$对象原transform属性值
		 * @example $(target).transform('rotate(-30deg)');
		 */
		if(!$.fn.transform){
			$.fn.transform = function (transform) {
				for (var i = 0; i < this.length; i++) {

					var elStyle = this[i].style;
					elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform;
				}
				return this;
			};
		}

		/**
		 * @memberof $
		 * @desc 对$.fn对象扩展, 对$对象添加css动画transition的过渡时间兼容方法 // 建议改名为transitionDuration
		 * @func transition
		 * @static
		 * @param {string / number} duration - 设定对象的transition动画过渡时间值, 示例如: 字符串'300ms'或数字300
		 * @example $(target).transition(300);
		 */
		if(!$.fn.transition){
			$.fn.transition =  function (duration) {
				if (typeof duration !== 'string') {
					duration = duration + 'ms';
				}
				for (var i = 0; i < this.length; i++) {
					var elStyle = this[i].style;
					elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration;
				}
				return this;
			};
		}

		/**
		 * @memberof $
		 * @desc 对$.fn对象扩展, 对$对象添加监听动画transition完成事件的绑定方法
		 * @func transitionEnd
		 * @static
		 * @param {func} callback - 在对象的transition动画执行完毕的执行函数
		 * @example $(target).transitionEnd(function(){
		 *      // callback for transitionEnd
		 * });
		 */
		if(!$.fn.transitionEnd){
			$.fn.transitionEnd = function (callback) {
				var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'],
					i, j, dom = this;
				function fireCallBack(e) {
					/*jshint validthis:true */
					if (e.target !== this) return;
					callback.call(this, e);
					for (i = 0; i < events.length; i++) {
						dom.off(events[i], fireCallBack);
					}
				}
				if (callback) {
					for (i = 0; i < events.length; i++) {
						dom.on(events[i], fireCallBack);
					}
				}
				return this;
			};
		}

		/**
		 * @memberof $
		 * @desc 对$.fn对象扩展, 对$对象添加监听对象的animation动画完成事件的绑定方法
		 * @func animationEnd
		 * @static
		 * @param {func} callback - 在对象的animation动画执行完毕的执行函数
		 * @example $(target).animationEnd(function(){
		 *      // callback for animationEnd
		 * });
		 */
		if(!$.fn.animationEnd){
			$.fn.animationEnd = function (callback) {
				var events = ['webkitAnimationEnd', 'OAnimationEnd', 'MSAnimationEnd', 'animationend'],
					i, j, dom = this;
				function fireCallBack(e) {
					callback(e);
					for (i = 0; i < events.length; i++) {
						dom.off(events[i], fireCallBack);
					}
				}
				if (callback) {
					for (i = 0; i < events.length; i++) {
						dom.on(events[i], fireCallBack);
					}
				}
				return this;
			};
		}
	}
});
